.TITLE DRCRV .IDENT /04.03/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; MODIFIED FOR M-PLUS V2.0 BY: ; ; J. M. LAWLER ; T. M. MARTIN ; D. R. DONCHIN ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; J. R. KAUFFMAN ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; B. S. MCCARTHY ; L. B. MCCULLEY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY: ; ; K. L. NOEL ; ; MODIFIED FOR CPRSX V1.1 BY: ; ; K. L. NOEL 29-December-1989 V4.02 ; ; KLN137 - Fix status returned for create VT on CPR and don't ; clobber r5 during deavt ; ; Paul K. M. Weiss 29-Jan-1990 V4.03 ; ; PKW190 - Link VT unit into data base before sending "Create ; Subprocess" packet so unit is not re-used. ; ; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINES ; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT. ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,DCBDF$,HDRDF$,TCBDF$,UCBDF$,CPRDF$ ABODF$ ;DEFINE ABORT CODES DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS HDRDF$ ;DEFINE TASK HEADER SYMBOLS TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS UCBDF$ ,,TTDEF,SYSDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLS CPRDF$ ;DEFINE CPR PACKETS OFFSETS AND SYMBOLS ; ; LOCAL SYMBOL DEFINITIONS ; D$LGTH=D.PCB+2 ;LENGTH OF VT DCB .IF DF C$$RTK ;REMOTE SYSTEM SUPPORT U$LGTH=U.VNAM+10-U.UAB ;LENGTH OF VT UCB .IFF U$LGTH=U.PTCB+2-U.UAB ;LENGTH OF VT UCB .ENDC ;REMOTE SYSTEM SUPPORT MAP6=140000 ;FIRST ADDRESS OF APR6 ;+ ; **-$DRCRV-CREATE VIRTUAL TERMINAL UNIT ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A VIRTUAL TERMINAL ; UNIT AND RETURN THE UNIT NUMBER IN THE DSW. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(149.),DPB SIZE(5.). ; WD. 01 -- INPUT AST ROUTINE ADDRESS. ; WD. 02 -- OUTPUT AST ROUTINE ADDRESS. ; WD. 03 -- ATTACH AST ROUTINE ADDRESS. ; WD. 04 -- MAXIMUM ALLOWED BUFFER LENGTH. ; ; INPUTS: ; ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE MAXIMUM BUFFER LENGTH WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; NUMBER OF CREATED VIRTUAL TERMINAL UNIT IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ALLOCATION ; FAILURE OCCURS. ; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE VIRTUAL ; TERMINAL DRIVER IS NOT LOADED. ;- .IF DF V$$TRM $DRCRV::TST $VTDCB+D.DSP ;VIRTUAL TERMINAL DRIVER LOADED? BNE 1$ ;IF NE YES JMP 100$ ;REPORT ERROR 1$: .IF DF C$$RTK ;REMOTE TASK SUPPORT BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 10$ ;IF EQ NO MOV #1,R1 ;SET FOR 1 BLOCK FROM CPRBUF MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START MOV R3,R5 ;SAVE R3 CALL $CPALO ;GET BUFFER FROM CPRBUF MOV R5,R3 ;RESTORE R3 MOV $TKTCB,R5 ; AND R5 MOV R0,-(SP) ;SAVE BUFFER BIAS 10$: .IFTF ;C$$RTK MOV #D$LGTH+U$LGTH,R1 ;PICK UP SIZE OF VT DATA BASE CALL $ALOCB ;ALLOCATE VT DATA BASE BCC 15$ ;IF CC OKAY .IFT ;C$$RTK BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 14$ ;IF EQ NO TST (SP)+ ;POP STACK 14$: .ENDC ;C$$RTK JMP 90$ ;ALLOCATION FAILURE 15$: MOV R0,R1 ;SAVE POINTER TO DCB MOV #$VTDCB,R2 ;POINT TO DATA BASE FOR VT0: 20$: MOV (R2)+,(R0)+ ;COPY WORD OF VT DATA BASE CMP R2,#$VTDCB+D$LGTH+U$LGTH ;DONE WITH COPY? BLO 20$ ;IF LO NO SUB #U$LGTH+U.UAB,R0 ;POINT BACK TO START OF UCB MOV R0,D.UCB(R1) ;SET UCB POINTER IN DCB MOV R1,(R0) ;SET DCB POINTER IN UCB (U.DCB) MOV R0,U.RED(R0) ;SET UP REDIRECTION POINTER (U.RED) BIT #T3.PRV,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED? BEQ 30$ ;IF EQ NO BIS #U2.PRV,U.CW2(R0) ;MAKE VIRTUAL TERMINAL PRIVILEGED 30$: ADD #U.IAST,R0 ;POINT TO PARENT INPUT AST ADDRESS .IF DF S$$LIB MOV (R3)+,R2 ;GET SPECIFIED INPUT AST ADDRESS CALL $CALTA ;CALCULATE CORRECT ADDRESS MOV R2,(R0)+ ;SET INPUT AST ADDRESS (U.IAST) MOV (R3)+,R2 ;GET SPECIFIED OUTPUT AST ADDRESS CALL $CALTA ;CALCULATE CORRECT ADDRESS MOV R2,(R0)+ ;SET OUTPUT AST ADDRESS (U.OAST) MOV (R3)+,R2 ;GET SPECIFIED ATTACH AST ADDRESS CALL $CALTA ;CALCULATE CORRECT ADDRESS MOV R2,(R0)+ ;SET ATTACH AST ADDRESS (U.AAST) .IFF MOV (R3)+,(R0)+ ;SET INPUT AST ADDRESS (U.IAST) MOV (R3)+,(R0)+ ;SET OUTPUT AST ADDRESS (U.OAST) MOV (R3)+,(R0)+ ;SET ATTACH AST ADDRESS (U.AAST) .ENDC MOV H.DUIC(R4),(R0)+ ;INITIALIZE DEFAULT UIC (U.UIC) MOV R5,(R0) ;SET PARENT TCB ADDRESS (U.PTCB) MOV (R3),R2 ;PICK UP SPECIFIED BUFFER LENGTH BEQ 40$ ;IF EQ STAY WITH DEFAULT MOV R2,U.CW4-U.PTCB(R0) ;STORE BUFFER LENGTH CMP R2,#V$$TLM ;GREATER THAN MAXIMUM? BLOS 40$ ;IF LOS NO BIS #U3.DBF,U.CW3-U.PTCB(R0) ;DISABLE INTERMEDIATE BUFFERING 40$: MOV #$VTDCB,R0 ;POINT TO DCB FOR VT0: 60$: MOV R0,R2 ;COPY POINTER TO PREVIOUS DCB MOV (R0),R0 ;POINT TO NEXT DCB ADD #401,D.UNIT(R1) ;ADVANCE LOW AND HIGH UNIT NUMBERS CMP D.NAM(R0),#"VT ;IS NEXT DCB FOR A VIRTUAL TERMINAL? BNE 70$ ;IF NE NO CMP D.UNIT(R1),D.UNIT(R0) ;IS IT THE NEXT CONSECUTIVE UNIT? BEQ 60$ ;IF EQ YES 70$: .IF DF C$$RTK BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 80$ ;IF EQ NO ; ; WE HAVE TO LINK THIS IN NOW IN CASE SOMEONE ELSE TRIES TO CREATE A VT: ; MOV R0,(R1) ;LINK NEW UNIT TO NEXT ONE MOV R1,(R2) ;LINK PREVIOUS UNIT TO NEW ONE MOV D.UCB(R1),R5 ;GET UCB ADDRESS IN R5 MOVB D.UNIT(R1),U.UNIT(R5) ;GIVE VT A PHYSICAL UNIT NUMBER CLC ;INDICATE ONLINE TRANSITION CALL $CPCON ;DO CROSS INDEX WITH CPDRIVER CLRB U.OCNT(R5) ;CLEAR OFFSPRING COUNT MOV (SP)+,KISAR6 ;MAP PACKET MOV #MAP6,R3 ;GET ADDRESS OF HEADER MOVB #HT$CSB,H$TYPE(R3) ;CREATE SUBPROCESS REQUEST CLRB H$ICNT(R3) ;NO ITEMS ADD #H$SIZE,R3 ;POINT TO PARAMETER AREA CLR (R3) ;GET UNIT NUMBER MOVB D.UNIT(R1),(R3) ;GET UNIT NUMBER ADD $RMTTT,(R3) ;ADD IN OFFSET OF NUMBER OF HT TERMINALS DEC (R3)+ ;VT0: IS JUST PROTO MOV R1,(R3) ;SAVE THE DCB CPSEN$ #SN$DIR,KISAR6,#H$SIZE+2 MOV R0,KISAR6 ;MAP PACKET MOV MAP6+P$DPB+2,R1 ;RESTORE THE DCB CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? BNE 75$ ;IF NE NO MOV D.UCB(R1),R3 ;GET VT'S UCB ADDRESS MOV U.CPUN(R3),MAP6+H$UNIT ;SET UNIT NUMBER CLR H$FLAG+MAP6 ;INDICATE NO FLAGS CLR H$RET+MAP6 ; AND NO RETURN ADDRESS MOV KISAR6,U.RAST(R3) ;STORE PACKET BIAS IN UCB FOR HT$DSB PACKET CLR -(SP) ;CLEAR WORD ON STACK MOVB D.UNIT(R1),(SP) ;SET UNIT NUMBER ON STACK MTPD$ @#H.DSW ;SET UNIT NUMBER IN USER'S DSW MOV $TKTCB,R5 ;GET TASK'S TCB ADDRESS AGAIN BR 85$ ;JOIN COMMON CODE 75$: MOV #$VTDCB,R0 ;GET POINTER TO VT DATABASE 76$: CMP (R0),R1 ;IS OUR VT NEXT? BEQ 77$ ;YES, REMOVE IT MOV (R0),R0 ;GET NEXT DCB BR 76$ ;TRY AGAIN 77$: MOV (R1),(R0) ;UNLINK FROM THE DATABASE MOV MAP6+H$STAT,-(SP) ;GET ERROR STATUS MOV R1,R0 ;GET DCB ADDRESS MOV #D$LGTH+U$LGTH,R1 ;GET LENGTH OF ALLOCATION CALL $DEACB ;DEALLOCATE DCB AND UCB MOV KISAR6,R0 ;GET ADDRESS OF CPRBUF ALLOCATION CALL $CPDEA ;DEALLOCATE CPRBUF PACKET MTPD$ @#H.DSW ;SET STATUS IN USER'S DSW BIS #1,$UMPS ;SET CARRY BIT RETURN ; 80$: .ENDC ;C$$RTK MOV R0,(R1) ;LINK NEW UNIT TO THIS ONE MOV R1,(R2) ;LINK PREVIOUS UNIT TO NEW ONE MOVB D.UNIT(R1),2(SP) ;SET UNIT NUMBER IN STATUS WORD ;+ ; ** W A R N I N G ** ; ; SPM HOOKPOINT NUMBER 23. ; ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM ;- $SPH23==. ;SPM CHANGES THE INSTRUCTION AT ;THE LOCATION OF THIS LABEL 85$: INC T.RDCT(R5) ;INC TASK RUNDOWN COUNT RETURN ; 90$: DRSTS D.RS1 ;ALLOCATION FAILURE 100$: DRSTS D.RS6 ;VIRTUAL TERMINAL DRIVER NOT LOADED ;+ ; **-$DRELV-ELIMINATE VIRTUAL TERMINAL UNIT ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED ; VIRTUAL TERMINAL UNIT. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(151.),DPB SIZE(2.). ; WD. 01 -- VIRTUAL TERMINAL UNIT NUMBER. ; ; INPUTS: ; ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE VIRTUAL TERMINAL UNIT NUMBER IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF '+1' IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS92' RETURNED IF THE ISSUING ; TASK DID NOT CREATE THE SPECIFIED VIRTUAL ; TERMINAL UNIT. ;- .ENABL LSB $DRELV::MOV #$VTDCB,R0 ;POINT TO FIRST VIRTUAL TERMINAL DCB 10$: CMPB D.UNIT(R0),(R3) ;IS THIS THE SPECIFIED UNIT? BEQ 30$ ;IF EQ YES MOV (R0),R0 ;POINT TO NEXT VIRTUAL TERMINAL DCB CMP D.NAM(R0),#"VT ;IS IT A VIRTUAL TERMINAL DCB? BEQ 10$ ;IF EQ YES 20$: DRSTS D.RS92 ;INVALID VIRTUAL TERMINAL UNIT 30$: MOV D.UCB(R0),R0 ;POINT TO VIRTUAL TERMINAL UCB CMP U.PTCB(R0),R5 ;IS ISSUING TASK THE PARENT? BNE 20$ ;IF NE NO, ILLEGAL ;+ ; **-$ELMVT-ELIMINATE VIRTUAL TERMINAL UNIT ; ; THIS ROUTINE ELIMINATES THE SPECIFIED VIRTUAL TERMINAL UNIT CREATED ; BY THE CURRENT TASK. ; ; INPUTS: ; ; R0=UCB ADDRESS OF VIRTUAL TERMINAL UNIT TO ELIMINATE ; ; OUTPUTS: ; ; ANY LUNS WHICH THE CURRENT TASK HAS ASSIGNED TO THE VIRTUAL ; TERMINAL UNIT ARE DEASSIGNED. IF THERE ARE ANY ACTIVE TASK'S ; WHOSE TI: IS THE VIRTUAL TERMINAL UNIT BEING ELIMINATED, THEY ; ARE ABORTED. AT THIS POINT AN ATTEMPT IS MADE TO ALLOCATE A ; COMMAND LINE TO MCR TO PERFORM ANY NECESSARY CLEANUP REQUIRED ; BY THE VIRTUAL TERMINAL. IF THE COMMAND LINE CANNOT BE ALLO- ; CATED, THE CURRENT TASK IS FORCED INTO A WAIT FOR SIGNIFICANT ; EVENT. (THE PC IS BACKED UP IN CASE THIS IS A ELVT$ DIRECTIVE. ; IF THE TASK IS EXITING, THE PC DOESN'T MATTER.) WHEN THE COM- ; MAND LINE IS SUCCESSFULLY QUEUED, THE UNIT IS MARKED FOR DEALLO- ; CATION AND THE CURRENT TASK'S RUNDOWN COUNT IS DECREMENTED. ; SINCE A COMMAND LINE IS ALWAYS QUEUED, $DEAVT CANNOT BE CALLED ; IMMEDIATELY. ;- $ELMVT::SAVNR ;SAVE R4 AND R5 MOV R0,R5 ;SAVE UCB ADDRESS CALL $CVTLN ;CLEAR OUT VIRTUAL TERMINAL LUN WORDS TSTB U.OCNT(R0) ;ANY OFFSPRING STILL ACTIVE? BEQ 85$ ;IF EQ NO, ELIMINATE UNIT ; ; AT THIS POINT THE STD IS SEARCHED FOR ANY ACTIVE TASKS WHOSE TI: IS ; THE VIRTUAL TERMINAL BEING ELIMINATED. THE STD IS SCANNED INSTEAD ; OF THE ATL TO FIND ANY TASKS WHICH ARE IN THE PROCESS OF BEING LOADED, ; THUS TS.EXE IS CLEAR BUT THEY ARE NOT YET IN THE ATL. ; MOV $TSKHD,R1 ;POINT TO FIRST TASK IN TASK LIST 70$: MOV T.TCBL(R1),-(SP) ;PUSH POINTER TO NEXT INSTALLED TASK BEQ 80$ ;IF EQ CURRENT TASK IS NULL TASK TST T.STAT(R1) ;TASK ACTIVE? BMI 80$ ;IF MI NO CMP T.UCB(R1),R5 ;OFFSPRING OF THIS UNIT? BNE 80$ ;IF NE NO BIT #T3.PRV!T3.SLV,T.ST3(R1) ;NO ABORT BECAUSE TASK ;PRIVILEGED OR SLAVE? BNE 80$ ;IF NE YES TSTB T.ST2(R1) ;TASK ALREADY EXITTING? BMI 80$ ;IF MI YES MOV #S.CELV,R0 ;SET TKTN ABORT CODE CALL $ABTSK ;ABORT THE TASK 80$: MOV (SP)+,R1 ;RESTORE POINTER TO NEXT TASK BNE 70$ ;IF NE THERE IS ONE 85$: CLR U.PTCB(R5) ;MARK UNIT FOR DEALLOCATION MOV $TKTCB,R3 ;PICK UP CURRENT TASK TCB ADDRESS DEC T.RDCT(R3) ;REDUCE TASK'S RUNDOWN COUNT CLR R1 ;SET STATUS TO REQUEST BYE MOV R5,R2 ;SET UCB ADDRESS CALL $QCNTP ;QUEUE A BYE COMMAND BEQ 90$ ;IF CC-Z SET THEN NO ERROR SUB #2,$UMPC ;BACKUP USER PC TO RE-EXECUTE DIRECTIVE CALLR $TKWSE ;FORCE TASK INTO WAIT FOR SIG EVENT 90$: MOV U.RPKT(R5),R0 ;GET INPUT (READ) PACKET BIS U.WPKT(R5),R0 ;GET OUTPUT (WRITE) PACKET BNE 160$ ;IF NE I/O IN PROGRESS BICB #US.BSY,U.STS(R5) ;MAKE SURE UNIT IS NOT BUSY CALLR $IOKIL ;INSURE PROPAGATION OF DRIVER ;+ ; **-$DEAVT-DEALLOCATE VIRTUAL TERMINAL UNIT ; ; THIS ROUTINE UNLINKS THE SPECIFIED VIRTUAL TERMINAL UNIT CONTROL ; BLOCKS FROM THE DEVICE LISTS AND DEALLOCATES THEM. ; ; INPUTS: ; ; R0=ADDRESS OF VIRTUAL TERMINAL UNIT UCB TO DEALLOCATE ; ; OUTPUTS: ; ; THE VIRTUAL TERMINAL UNIT IS UNLINKED AND DEALLOCATED. ;- $DEAVT::MOV (R0),R0 ;POINT TO VIRTUAL TERMINAL DCB (U.DCB) ;+ ; ** W A R N I N G ** ; ; SPM HOOKPOINT NUMBER 24. ; ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM ;- $SPH24==. ;SPM CHANGES THE INSTRUCTION AT ;THE LOCATION OF THIS LABEL MOV #$VTDCB,R1 ;POINT TO FIRST VIRTUAL TERMINAL DCB 100$: CMP (R1),R0 ;NEXT UNIT SPECIFIED? BEQ 110$ ;IF EQ YES MOV (R1),R1 ;POINT TO NEXT VIRTUAL TERMINAL DCB BR 100$ ; 110$: MOV (R0),(R1) ;UNLINK DCB .IF DF C$$RTK ;REMOTE TASKS BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 115$ ;IF EQ NO MOV D.UCB(R0),R3 ;GET ADDRESS OF UCB MOV U.RAST(R3),KISAR6 ;MAP PACKET CLR U.RAST(R3) ;GET RID OF REFERENCE TO PACKET MOV #MAP6,R3 ;POINT TO PACKET MOVB #HT$DSB,H$TYPE(R3) ;DELETE SUBPROCESS TYPE MOV R0,-(SP) ;SAVE R0 CPSEN$ #SF$IRT,KISAR6,#H$SIZE MOV (SP)+,R0 ;RESTORE R0 115$: .ENDC ;C$$RTK MOV #D$LGTH+U$LGTH,R1 ;SET SIZE TO DEALLOCATE CALLR $DEACB ;DEALLOCATE DATA STRUCTURES ;+ ; **-$CVTLN-CLEAR VIRTUAL TERMINAL LUN WORDS ; ; THIS ROUTINE IS CALLED TO CLEAR (DEASSIGN) ANY LUN ENTRIES FOR THE ; CURRENT TASK WHICH POINT TO THE SPECIFIED VIRTUAL TERMINAL UCB. ; ; INPUTS: ; ; R0=VIRTUAL TERMINAL UCB ADDRESS ; ; OUTPUTS: ; ; R0 AND R3 ARE PRESERVED. ;- $CVTLN:: .IF DF X$$HDR MOV KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING MOV $SAHDB,KISAR6 ;MAP NONRESIDENT TASK HEADER .ENDC ; DF X$$HDR MOV $SAHPT,R1 ;GET HEADER ADDRESS ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS WORD IN HEADER MOV (R1)+,R2 ;PICK UP NUMBER OF LUNS 120$: DEC R2 ;ANY MORE LUNS? BLT 150$ ;IF LT NO CMP (R1),R0 ;LUN ASSIGNED TO ELIMINATING UNIT? BNE 130$ ;IF NE NO CLR (R1) ;DEASSIGN LUN 130$: CMP (R1)+,(R1)+ ;POINT TO NEXT LUN BR 120$ ; 150$: ;REFERENCE LABEL .IF DF X$$HDR MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING .ENDC 160$: RETURN ; .ENDC .END